﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biblioteca.dao.iClassesDAO.pessoa;
using Biblioteca.classesBasicas.pessoa;
using Biblioteca.util;
using System.Data;
using System.Data.SqlClient;

namespace Biblioteca.dao.classesDAO.pessoa
{
    class ClienteDAO : Conexao, IClienteDAO
    {
        public void cadastrar(Cliente objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comandoSql = conexao.CreateCommand();
                comandoSql.CommandText = "INSERT INTO CLIENTE(NOME, SEXO, IDADE, RG, CPF) VALUES ('" + objeto.Nome +"','" + objeto.Sexo + "','" + objeto.Idade + "','" + objeto.Rg + "','" + objeto.Cpf + "')";
                comandoSql.ExecuteNonQuery();
                comandoSql.Dispose();
                this.fecharConexao();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao cadastar Cliente.");
            }
            finally
            {
                this.fecharConexao();
            }
        }


        public void alterar(Cliente objeto)
        {
                        
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("UPDATE CLIENTE SET NOME='" + objeto.Nome + "', SEXO='" + objeto.Sexo + "', IDADE='" + objeto.Idade + "', RG='" + objeto.Rg + "', CPF='" + objeto.Cpf + "'" + " WHERE CLIENTE.ID_CLIENTE=" + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao alterar Cliente.");
            }

            finally
            {
                this.fecharConexao();
            }
        }

        //Executar Procedure antes no Banco
        public void remover(Cliente objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("EXEC PROCEDURE_DELETAR_CLIENTE " + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao remover Cliente.");
            }

            finally
            {
                this.fecharConexao();
            }
        }

        
        public Cliente consultarPorId(string id)
        {
            Cliente clienteMetodo = null;
            
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_CLIENTE, NOME, SEXO, IDADE, RG, CPF FROM CLIENTE WHERE CLIENTE.ID_CLIENTE=" + Convert.ToInt32(id) , this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                if (DbReader.Read())
                {
                    clienteMetodo = new Cliente();
                    clienteMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_CLIENTE")));
                    clienteMetodo.Nome = DbReader.GetString(DbReader.GetOrdinal("NOME"));
                    clienteMetodo.Sexo = DbReader.GetString(DbReader.GetOrdinal("SEXO"));
                    clienteMetodo.Idade = DbReader.GetString(DbReader.GetOrdinal("IDADE"));
                    clienteMetodo.Rg = DbReader.GetString(DbReader.GetOrdinal("RG"));
                    clienteMetodo.Cpf = DbReader.GetString(DbReader.GetOrdinal("CPF"));
                }
                
                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao consultar o Cliente.");
            }

            finally
            {
                this.fecharConexao();
            }
            return clienteMetodo;
        }


        public List<Cliente> listar()
        {
            List<Cliente> listaCliente = new List<Cliente>();

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_CLIENTE, NOME, SEXO, IDADE, RG, CPF FROM CLIENTE", this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                while (DbReader.Read())
                {
                    Cliente clienteMetodo = new Cliente();
                    clienteMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_CLIENTE")));
                    clienteMetodo.Nome = DbReader.GetString(DbReader.GetOrdinal("NOME"));
                    clienteMetodo.Sexo = DbReader.GetString(DbReader.GetOrdinal("SEXO"));
                    clienteMetodo.Idade = DbReader.GetString(DbReader.GetOrdinal("IDADE"));
                    clienteMetodo.Rg = DbReader.GetString(DbReader.GetOrdinal("RG"));
                    clienteMetodo.Cpf = DbReader.GetString(DbReader.GetOrdinal("CPF"));

                    listaCliente.Add(clienteMetodo);
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao listar o Cliente.");
            }

            finally
            {
                this.fecharConexao();
            }
            return listaCliente;
        }

        public List<Cliente> listarClientePorPartida(classesBasicas.jogo.Partida partida)
        {
            List<Cliente> listaCliente = new List<Cliente>();

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT CLIENTE.ID_CLIENTE, CLIENTE.NOME, CLIENTE.SEXO, CLIENTE.IDADE," + 
                                                    "CLIENTE.RG, CLIENTE.CPF FROM CLIENTE" +
                                                    "INNER JOIN RESPONSAVEL ON CLIENTE.ID_CLIENTE = RESPONSAVEL.ID_CLIENTE" +
                                                    "INNER JOIN JOGADOR ON RESPONSAVEL.ID_RESPONSAVEL = JOGADOR.ID_RESPONSAVEL" +
                                                    "INNER JOIN PARTIDA ON JOGADOR.ID_PARTIDA = PARTIDA.ID_PARTIDA" +
                                                    "WHERE PARTIDA.ID_PARTIDA = 1; ", this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                while (DbReader.Read())
                {
                    Cliente clienteMetodo = new Cliente();
                    clienteMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_CLIENTE")));
                    clienteMetodo.Nome = DbReader.GetString(DbReader.GetOrdinal("NOME"));
                    clienteMetodo.Sexo = DbReader.GetString(DbReader.GetOrdinal("SEXO"));
                    clienteMetodo.Idade = DbReader.GetString(DbReader.GetOrdinal("IDADE"));
                    clienteMetodo.Rg = DbReader.GetString(DbReader.GetOrdinal("RG"));
                    clienteMetodo.Cpf = DbReader.GetString(DbReader.GetOrdinal("CPF"));

                    listaCliente.Add(clienteMetodo);
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao listar o Cliente.");
            }

            finally
            {
                this.fecharConexao();
            }
            return listaCliente;
        }
    }
}
